{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from fit.datamodules.super_res import MNIST_SResFITDM\n",
    "from fit.utils.tomo_utils import get_polar_rfft_coords_2D\n",
    "\n",
    "from fit.modules.SResTransformerModule import SResTransformerModule\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "from matplotlib import gridspec\n",
    "\n",
    "import torch\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "from pytorch_lightning import Trainer, seed_everything\n",
    "from pytorch_lightning.callbacks import ModelCheckpoint\n",
    "\n",
    "from os.path import exists\n",
    "import wget"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Global seed set to 22122020\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "22122020"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seed_everything(22122020)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "dm = MNIST_SResFITDM(root_dir='./datamodules/data/', batch_size=32)\n",
    "dm.prepare_data()\n",
    "dm.setup()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "r, phi, flatten_order, order = get_polar_rfft_coords_2D(img_shape=dm.gt_shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_heads = 8\n",
    "d_query = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = SResTransformerModule(d_model=n_heads*d_query, \n",
    "                              img_shape=dm.gt_shape,\n",
    "                              coords=(r, phi),\n",
    "                              dst_flatten_order=flatten_order,\n",
    "                              dst_order=order,\n",
    "                              loss='prod',\n",
    "                              lr=0.0001, weight_decay=0.01, n_layers=8,\n",
    "                              n_heads=n_heads, d_query=d_query, dropout=0.1, attention_dropout=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "GPU available: True, used: True\n",
      "TPU available: False, using: 0 TPU cores\n"
     ]
    }
   ],
   "source": [
    "trainer = Trainer(max_epochs=100, \n",
    "                  gpus=1, # set to 0 if you want to run on CPU\n",
    "                  checkpoint_callback=ModelCheckpoint(\n",
    "                                            dirpath=None,\n",
    "                                            save_top_k=1,\n",
    "                                            verbose=False,\n",
    "                                            save_last=True,\n",
    "                                            monitor='Train/avg_val_loss',\n",
    "                                            mode='min',\n",
    "                                            prefix='best_val_loss_'\n",
    "                                        ), \n",
    "                  deterministic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Train your own model.\n",
    "# trainer.fit(model, datamodule=dm);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not exists('./models/sres/mnist_sres.ckpt'):\n",
    "    wget.download('https://cloud.mpi-cbg.de/index.php/s/IRlG3WG8TdJz2dl/download',\n",
    "                  out='./models/sres/mnist_sres.ckpt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.load_test_model('./models/sres/mnist_sres.ckpt')\n",
    "model.cpu();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_rings = 5\n",
    "\n",
    "x, y = np.meshgrid(range(model.dft_shape[1]), range(-model.dft_shape[0] // 2 + 1, model.dft_shape[0] // 2 + 1))\n",
    "radii = np.sqrt(x ** 2 + y ** 2, dtype=np.float32)\n",
    "selected_rings = np.round(radii) < num_rings\n",
    "\n",
    "model.input_seq_length = np.sum(selected_rings)\n",
    "plt.imshow(selected_rings)\n",
    "plt.title('Prefix');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "for fc, (mag_min, mag_max) in dm.test_dataloader():\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "lowres, pred_img, gt = model.get_lowres_pred_gt(fc, mag_min, mag_max)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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8YyqWXv37k1n1qxZk87ccsst6UxExGc/+9l05tRTT01nzjjjjHQmIuLcc89NZ3bs2FE1q2atf8Mb3pDO1KzZEREbNmxIZ66//vp05qabbkpnIiJGR0erclm1x/+ac8n5+fmqWdlzajgcNedTF110UdWsd7/73enMW9/61nSm9tiwefPmdKbmfO/9739/OlM76/LLL09nvvSlL6UztEXLAQAAANAgpQ0AAABAg5Q2AAAAAA1S2gAAAAA0SGkDAAAA0CClDQAAAECDlDYAAAAADVLaAAAAADRIaQMAAADQIKUNAAAAQIOUNgAAAAANUtoAAAAANEhpAwAAANCg0nXd4W9cyuFvfAxMTEykM0NDdb3V/Px8OrO4uJjOjI6OpjMRESeddFI6c9pppw1kTkTEqlWr0pnh4eF0Zs2aNelMRMTWrVvTmec+97npzNlnn53ORNTdFzt27EhnvvSlL6UzERFf/OIX05n77ruvatagjI2NpTPj4+NVs+bm5tKZ+fn5G7uue2HVwBVKKV12Xaxdp2rW0cwxa7+RkZF0JiKilFKVq7GwsJDOXHbZZenMV7/61XQmIuLiiy9OZ+6///50pubxjYh40YtelM6sXr26atZrX/vadObyyy9PZ2rXj7/8y79MZ97znvekM7feems6U6vmnGFpaalqVs26NEhd1z3phan183me2jZt2pTOnH766VWzrrzyynTmda97XTpz3nnnpTMRdecZN9xwQzrz8pe/PJ3hmDng+bwrbQAAAAAapLQBAAAAaJDSBgAAAKBBShsAAACABiltAAAAABqktAEAAABokNIGAAAAoEFKGwAAAIAGKW0AAAAAGqS0AQAAAGiQ0gYAAACgQUobAAAAgAaNHOsdONYmJiaqcuPj4+nMwsJCOrO8vJzORETs2bMnnZmcnExnHn300XRmkIaHh6tyl112WTpz4oknpjMXXnhhOhMRsXHjxnSm5vHdsGFDOhNR9/poXc1tGhqq68Vr1oojKbvuzM3NVc2puX9q79Max/pxeCLXX3/9wGbdeOON6czmzZvTmd27d6czERGf//znq3I1ap7vZ5xxRjrz0pe+NJ2JiDjnnHPSmVNOOSWdufXWW9OZQZqfn6/K1az1tedqWYuLiwOZA0fTrl27BpKJiNi+fXs686EPfSid+b3f+710JiLizW9+czpz6aWXpjNvf/vb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mpqqynFgtY/D0tJSOjM7O5vODA8PpzMRdftXO+uVr3xlOnPZZZelMy95yUvSmYi61+fo6Gg6c84556QzERH33ntvOvPhD3+4atYf/uEfpjM//vGP05mJiYl0JqLuNVKj5vVxPBgZSZ0aR0T9+ef4+Hhq+/n5+ao5HHtr1qypyn3yk588wntyYFdccUVVrub4v7y8nM7cc8896UxExK/8yq+kM9u2bauaBUeTK20AAAAAGqS0AQAAAGiQ0gYAAACgQUobAAAAgAYpbQAAAAAapLQBAAAAaJDSBgAAAKBBShsAAACABiltAAAAABqktAEAAABokNIGAAAAoEFKGwAAAIAGjRztAfPz81W52dnZI7wnR9bw8HA688xnPjOdedaznpXOREScccYZ6cyJJ56YziwsLKQzERH33XdfOnPHHXekM7fffns6ExFx6623DmTWww8/nM4cD9atW5fOrF69Op2pff51XVeVezoopcTo6GgqU7vO16h57JaWlo7CnhzYCSecUJV79rOfnc782q/9WjozMlJ32N+xY0c6s3PnznRm+/bt6UxExKc+9al05rrrrquatby8XJXLGuR50Pj4eDpTu/6WUtKZmtd97eM0MzNTlauRXZscu45fv/mbv1mVe+1rX5vODOo1FlH3Orv22mvTmXe+853pTETErl27qnLQGlfaAAAAADRIaQMAAADQIKUNAAAAQIOUNgAAAAANUtoAAAAANEhpAwAAANAgpQ0AAABAg5Q2AAAAAA1S2gAAAAA0SGkDAAAA0CClDQAAAECDlDYAAAAADVLaAAAAADRoJBsYGsr1PPPz89kRERGxtLRUlRuU0dHRdGbNmjXpzKpVq9KZWpOTk+nMrl27qmbdcsst6cx3v/vddOb73/9+OhMRsXv37qrcU00ppSo3PDycziwuLqYzc3Nz6UxE++vLsdR1XSwsLAxkVs3zZJCP3bp169KZmnU+ou6Ycvvtt6cz559/fjoTEXHGGWekM9ddd10686EPfSidiYjYsWNHVa5lmzdvrsrVrNtd16Uze/bsSWci6l73MzMz6czY2Fg6E1F33lo7a1BrLcfeSSedVJWreT1PT0+nM7Vr6NVXX53ObNu2rWoWPJ250gYAAACgQUobAAAAgAYpbQAAAAAapLQBAAAAaJDSBgAAAKBBShsAAACABiltAAAAABqktAEAAABokNIGAAAAoEFKGwAAAIAGKW0AAAAAGqS0AQAAAGjQSGbjUkoMDw+nBiwsLKS2fyqbnZ1NZ3bv3l016+67705nhobyHd7999+fzkREfO9730tnbr755nRmcnIyneGnRkZSS8RPzMzMpDP79u1LZxYXF9OZQap5TUVEjI2NpTM168vBdF13xL7XoSwtLQ1kzvj4eFVuamoqndmyZUvVrHvvvTed+eAHP5jO1N4XNceU22+/PZ354Q9/mM4cD04//fR0Zu/evVWzao57NWvV8vJyOlMre+4ZETE/P38U9uTAas91B7XWcuzdcMMNVbnzzjsvnfnSl76UznzgAx9IZ4DBcaUNAAAAQIOUNgAAAAANUtoAAAAANEhpAwAAANAgpQ0AAABAg5Q2AAAAAA1S2gAAAAA0SGkDAAAA0CClDQAAAECDlDYAAAAADVLaAAAAADRIaQMAAADQoNJ13WFvPDw83E1MTKQGzMzMZPcpIiIy+3UsDA8PpzOnnnpqOnPaaaelMxERJ554YlUu6+GHH67K3X333enMvffeWzWrZePj41W57Oswou41NT09nc5ERCwuLlblWjY0lO+4ax6niLr1ZWpq6sau615YNXCFUkpXSkllWl+va61fvz6dmZqaqpo1NjaWzpxzzjnpzO7du9OZiIhHHnkknZmdna2aNSirVq2qytWsBQsLC+nM/Px8OjNItfdf7XlhVu3xdW5uLp3Jrpn71aydXdfVDVuhlPLUXLQBjn8HPJ93pQ0AAABAg5Q2AAAAAA1S2gAAAAA0SGkDAAAA0CClDQAAAECDlDYAAAAADVLaAAAAADRIaQMAAADQIKUNAAAAQIOUNgAAAAANUtoAAAAANEhpAwAAANAgpQ0AAABAg0rXdYe/cSndyMhIasDS0lJ2nyIiIrNfx4vh4eF0Znx8vGpWTW5oKN/hLSwspDMREY8++mg6U/tcqlHzWG3YsCGdWbduXTpTq+Y+3717d9Ws5eXlqlzLRkdHB5KJqLv/Zmdnb+y67oVVA1copXQ1a0HlrHSmZh2ofRxq1zfqjY2NVeU2bdqUzmTPZ/bbu3dvOjM5OVk166lozZo16UzNa3F+fj6diahbL2rXiuwa2HVddF2XXzj/9tyn3kk2wFPDAc/nXWkDAAAA0CClDQAAAECDlDYAAAAADVLaAAAAADRIaQMAAADQIKUNAAAAQIOUNgAAAAANUtoAAAAANEhpAwAAANAgpQ0AAABAg5Q2AAAAAA1S2gAAAAA0qHRdd/gbl/JQRNx19HYHgEpndF23+cl+E+s8QLOs8wBPbQdc51OlDQAAAACD4cejAAAAABqktAEAAABokNIGAAAAoEFKGwAAAIAGKW0AAAAAGqS0AQAAAGiQ0gYAAACgQUobAAAAgAYpbQAAAAAa9P8DlY63KuyDfLkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1116x360 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample = 30\n",
    "fig = plt.figure(figsize=(31/2., 10/2.)) \n",
    "gs = gridspec.GridSpec(1, 5, width_ratios=[10,0.5, 10, 0.5, 10]) \n",
    "ax0 = plt.subplot(gs[0])\n",
    "ax1 = plt.subplot(gs[2])\n",
    "ax2 = plt.subplot(gs[4])\n",
    "plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, \n",
    "                    hspace = 0, wspace = 0)\n",
    "\n",
    "ax0.xaxis.set_major_locator(plt.NullLocator())\n",
    "ax0.yaxis.set_major_locator(plt.NullLocator())\n",
    "ax0.imshow(lowres[sample], cmap='gray', vmin=gt[sample].min(), vmax=gt[sample].max())\n",
    "ax0.set_title('Low-Resolution Input');\n",
    "ax0.axis('equal');\n",
    "\n",
    "ax1.xaxis.set_major_locator(plt.NullLocator())\n",
    "ax1.yaxis.set_major_locator(plt.NullLocator())\n",
    "ax1.imshow(pred_img[sample], cmap='gray', vmin=gt[sample].min(), vmax=gt[sample].max())\n",
    "ax1.set_title('Prediction');\n",
    "ax1.axis('equal');\n",
    "\n",
    "\n",
    "ax2.xaxis.set_major_locator(plt.NullLocator())\n",
    "ax2.yaxis.set_major_locator(plt.NullLocator())\n",
    "ax2.imshow(gt[sample], cmap='gray')\n",
    "ax2.set_title('Ground Truth');\n",
    "ax2.axis('equal');"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
